<?php
/**
 * Con esta clase se genera URL limpias y ademas urls es parte necesaria para "component"
 * se mejoro setArgs
 * +se adiciona soporte para los controladores getController
 * @author rootciv
 * @version 1.6
 * +URL::getArgument
 */
class URL
{
	public static $init = false;
	public static $instance;
	//public static $DS = "/";//delimiter for Modules
	public static $DS = '.';//delimiter for Modules
	public static $ESCAPE_DS = '@';

	private static $get;
	private static $tmpGet = array();
	private static $url = "";
	private static $file = "";

	private static $amp_encode = "&amp;";
	private static $amp = '&';
	private function __construct ($url, $file)
	{
		self::$url = $url;
		//self::$file = ltrim($file,"/");
		self::$file = $file;
		self::$get = isset($_GET)?$_GET: array();
	}
	/**
	 * con esto se inicializa la clase URL
	 * @param string $url la ubicacion donde se generar los links por defecto
	 * @param string $file el archivo encargado de gestionar la url
	 * @return boolean
	 */
	public static function initialize ($url, $file)
	{
		if ( self::$init )
		{
			return false;
		} else
		{
			self::$instance = new URL($url, $file);
		}
	}
	/**
	 * deleteArgs("delme1","delme2");
	 * @param string $mixed para borrar las varibles que haya en self::$tmpGet
	 */
	public function deleteArgs($mixed)
	{
		foreach (func_get_args() as $name)
		{
			if(isset(self::$tmpGet[$name]))
			{
				unset(self::$tmpGet[$name]);
			}
		}
		return $this;
	}
	/*public static function deleteArg($mixed)
	{
		foreach (func_get_args() as $name)
		{
			if(isset(self::$tmpGet[$name]))
			{
				unset(self::$tmpGet[$name]);
			}
		}
	}/**/
	public function setArg($name_var,$n0 = false)
	{
		if(is_array($n0))
		{

			self::$tmpGet[$name_var] = implode(self::$DS, $n0);
		}
		else
		{
			$tmp = func_get_args();
			if ( count($tmp) > 1 )
			{
				self::$tmpGet[$name_var] = '';
				$ds = '';
				$nombre_var = array_shift($tmp);
				$traslate = array(self::$DS => self::$ESCAPE_DS . self::$DS);
				foreach($tmp as $p)
				{
					self::$tmpGet[$name_var] .= $ds . strtr($p,$traslate);
					$ds = self::$DS;
				}
			}
			else
			{
				self::$tmpGet[$name_var] = $n0;
			}
		}
		return $this;
	}
	/**
	 * Enter description here ...
	 * @param string $name_var nombre de la variable las otras variables forman parte de un sub_grupo
	 * @return URL
	 */
	public function rawSetArg ($name_var,$n0 = false)
	{
		if(is_array($n0))
		{

			self::$tmpGet[$name_var] = implode(self::$DS, $n0);
		}
		else
		{
			$tmp = func_get_args();
			if ( count($tmp) > 1 )
			{

				$nombre_var = array_shift($tmp);
				self::$tmpGet[$name_var] = implode(self::$DS, $tmp);
			}
			else
			{
				self::$tmpGet[$name_var] = $n0;
			}
		}
		return $this;
	}
	/**
	 * Forma de instanciar
	 * @param string $name_var nombre de la viriable las otras variables forman parte de un sub_grupo
	 * @return URL
	 */
	public static function rawSetArgument($name_var ,$n0 =false)
	{
		$arguments = func_get_args();
		return call_user_func_array(array(self::$instance,'rawSetArg'),$arguments);
	}
	/**
	 * @param  $name_var
	 * @param $value
	 * @return URL
	 */
	public static function setArgument($name_var ,$n0 =false)
	{
		$arguments = func_get_args();
		return call_user_func_array(array(self::$instance,'setArg'),$arguments);
	}
	public function createNewLink($base_url,$file)
	{
		$tmp = http_build_query(self::$tmpGet,'',self::$amp_encode);
		return $base_url.$file.(empty($tmp)?'':'?'.$tmp);
	}
	public function createRAWNewLink($base_url,$file)
	{
		$tmp = http_build_query(self::$tmpGet,'',self::$amp);
		return $base_url.$file.(empty($tmp)?'':'?'.$tmp);
	}
	/**
	 * Genera la Url si es que es convertida a un string
	 * @param string $file genera el enlace con el archivo indicado
	 * @param boolean $new_url seleccionar si es que va a generar una url nuevo o sobreponer la actual
	 * @return string
	 */
	public function create($file = null,$new_url = false)
	{
		$file = ($file == null)? self::$file: $file;
		$tmp = self::$tmpGet;
		if($new_url == true)
		{

		}
		else
		{
			$tmp = array_merge(self::$get,self::$tmpGet);
		}
		self::$tmpGet = array();
		$tmp = http_build_query($tmp,"",self::$amp_encode);
		return self::$url.$file.(empty($tmp)?"":"?".$tmp);
	}
	public function createRAW($file = null,$new_url = false)
	{
		$file = ($file == null)? self::$file: $file;
		$tmp = self::$tmpGet;
		if($new_url == true)
		{

		}
		else
		{
			$tmp = array_merge(self::$get,self::$tmpGet);
		}
		self::$tmpGet = array();
		$tmp = http_build_query($tmp,"",self::$amp);
		return self::$url.$file.(empty($tmp)?"":"?".$tmp);
	}
	/**
	 * Genera la Url si es que es convertida a un string
	 * @return string
	 */
	public function __toString()
	{
		return $this->create();
	}
	/**
	 * getting value of variable $_GET
	 * @param string $name
	 * @param boolena $return_values
	 * @return mixed
	 */
	public static function GET($name,$return_values=false)
	{
		if($return_values)
		{
			if(isset($_GET[$name]))
			{
				return is_string($_GET[$name])? explode(self::$DS, $_GET[$name]):null;
			}
			return null;
		}
		else
		{
			return isset($_GET[$name]) ? $_GET[$name]:null;
		}
	}
	/**
	 * URL::getArgument(string $name,ref & $pieces)
	 *
	 * @param string $name
	 * @param mixed & $pieces by ref
	 * @return bool
	 */
	public static function getArgument($name, & $pieces)
	{
		if(isset($_GET[$name]))
		//if(filter_has_var(INPUT_GET,$name))
		{
			$pieces = system::explode(self::$DS,$_GET[$name],self::$ESCAPE_DS);
			return true;
		}
		return false;
	}
	/**
	 * Este metodo retorna el nombre del controlador y los demas como argumentos muy util y retorna false si no se encuentra
	 * URL::getController(string $name,ref & $pieces)
	 * @param string $name nombre del contolador
	 * @param mixed & $argumentos by ref variable del tipo array que retorna los argumentos
	 * @param mixed & $controller_default el valor por defecto al no encontrarse la variable
	 * @return string|bool
	 */
	public static function getController($name, & $arguments = array(),$controller_default = false)
	{
		if(isset($_GET[$name]))
		{
			$arguments = system::explode(self::$DS,$_GET[$name],self::$ESCAPE_DS);
			return array_shift($arguments);
		}else{$arguments = array();}
		return $controller_default;
	}
	/**
	 * if exists var $_GET[$name]
	 * @param Boolean $name
	 */
	public static function exists($name)
	{
			return isset($_GET[$name]);
	}
}